#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using std::placeholders::_1;

class MinimalSubscriber : public rclcpp::Node
{
  public:
    MinimalSubscriber()
    : Node("minimal_subscriber")//节点名叫minimal_subscriber
    {
      subscription_ = this->create_subscription<std_msgs::msg::String>(       //构造函数中创建了订阅者，订阅String消息
      "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));  //订阅的话题名叫做“topic”，保存消息的队列长度是10，当订阅到数据时，会进入回调函数topic_callback
    }//发布者和订阅者使用的话题名称和消息类型必须匹配才能进行通信。

  private:
    void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
    {
      RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());//回调函数中会收到String消息，通过RCLCPP_INFO打印出来。
    }
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalSubscriber>());//于发布者节点而言，rclcpp::spin意味着启动计时器，但对于订阅者而言，rclcpp::spin仅仅意味着随时准备接收消息。
  rclcpp::shutdown();
  return 0;
}
